package com.sz.admin.ai.controller.test;

import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @描述:
 * @Author: TangYuan
 * @Date: 2025/2/19 14:06
 */
@RequestMapping("demo/message")
@RestController
@AllArgsConstructor
public class DemoController {
    //
    // /*
    //  * ## 接口设计
    //  *
    //  * 1. 统一接口 -> 判断不同平台的模型 -> 调用不同的平台接口
    //  * 2. 请求字段统一 -> controller -> 具体平台的service
    //  *      平台名
    //  *      模型名
    //  *      发送的消息
    //  *      用户
    //  *      知识库
    //  *      智能体内容
    //  *      模型的参数（温度这些）
    //  *      ........
    //  * 2.   返回值统一 -> 不同的平台可能返回值不同，找相同的返回值进行封装
    //  *      ........
    //  */
    //
    //
    // /*
    //  ? **思考**
    //  *
    //  * 两张表，会话表 (ai_session)  消息表 (ai_message)
    //  *
    //  * 1. 回话保存 -> MySql数据库
    //  * 2. 用户 -> 创建会话 -> 获取会话id -> 调用对话模型 -> 提问 -> 获取回答
    //  * 3. 消息保存 -> MySql数据库
    //  * 4. 基础消息InMemoryChatMemory -> 实现ChatMemory -> 后期结合数据库InMySqlChatMemory -> 根据会话id查询消息
    //  */
    //
    // private final OllamaChatModel chatModel;
    // private final ChatMemory chatMemory = new InMemoryChatMemory() {};
    //
    // private final JdbcTemplate jdbcTemplate;
    //
    //
    //
    // /**
    //  * 非流式问答
    //  * @param prompt 用户提问
    //  * @return ChatResponse
    //  */
    // @GetMapping(value = "chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    // public String chat(@RequestParam String prompt, @RequestParam String sessionId) {
    //     String system = """
    //             你是一个好用的翻译助手。
    //             将所有非中文的翻译成中文。
    //             将中文的翻译成英文。
    //             我发给你所有的话都是需要翻译的内容，你只需要回答翻译结果。翻译结果请符合中文的语言习惯。
    //             """;
    //
    //     MessageChatMemoryAdvisor messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory, sessionId, 10);
    //
    //     ChatClient chatClient = ChatClient.create(chatModel);
    //     String content = chatClient.prompt()
    //             .system(system)
    //             .user(prompt)
    //             .advisors(messageChatMemoryAdvisor)
    //             .call()
    //             .content();
    //
    //     System.out.println(content);
    //
    //     return content;
    // }
    //
    //
    // /**
    //  * 嵌入文件 ---> 存数据库
    //  * @param file 待嵌入的文件
    //  * @return 是否成功
    //  */
    // @SneakyThrows
    // @PostMapping("myEmbedding")
    // public Boolean myEmbedding(@RequestParam MultipartFile file) {
    //
    //     // 从IO流中读取文件
    //     TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new InputStreamResource(file.getInputStream()));
    //     // 将文本内容划分成更小的块
    //     List<Document> splitDocuments = new TokenTextSplitter().apply(tikaDocumentReader.read());
    //     // 存入向量数据库，这个过程会自动调用embeddingModel,将文本变成向量再存入。
    //
    //     List<Document> splitDocumentList = new ArrayList<>();
    //     for (Document splitDocument : splitDocuments) {
    //
    //         Map<String, Object> metadata = splitDocument.getMetadata();
    //         metadata.put("userId", "8888888");
    //
    //         splitDocument = Document.builder()
    //                 .id(splitDocument.getId())
    //                 .text(splitDocument.getText())
    //                 .media(splitDocument.getMedia())
    //                 .metadata(metadata)
    //                 .score(splitDocument.getScore())
    //                 .build();
    //         splitDocumentList.add(splitDocument);
    //     }
    //
    //     OllamaOptions ollamaOptions = OllamaOptions.builder().model("nomic-embed-text:latest").build();
    //     OllamaApi ollamaApi = new OllamaApi("http://127.0.0.1:11434");
    //     OllamaEmbeddingModel embeddingModel = OllamaEmbeddingModel.builder().ollamaApi(ollamaApi).defaultOptions(ollamaOptions).build();
    //
    //     PgVectorStore build = PgVectorStore
    //             .builder(jdbcTemplate, embeddingModel)
    //             .schemaName("public")
    //             .vectorTableName("vector_store")
    //             .indexType(PgVectorStore.PgIndexType.HNSW)
    //             .initializeSchema(true)
    //             .vectorTableValidationsEnabled(true)
    //             .removeExistingVectorStoreTable(true)
    //             .build();
    //
    //     build.add(splitDocumentList);
    //     return true;
    // }
    //
    // @GetMapping("/myDocumentSearch")
    // public List<Document> myDocumentSearch(@RequestParam String message) {
    //
    //     OllamaOptions ollamaOptions = OllamaOptions.builder().model("nomic-embed-text:latest").build();
    //     OllamaApi ollamaApi = new OllamaApi("http://127.0.0.1:11434");
    //     OllamaEmbeddingModel embeddingModel = OllamaEmbeddingModel.builder().ollamaApi(ollamaApi).defaultOptions(ollamaOptions).build();
    //
    //     PgVectorStore vectorStore = PgVectorStore
    //             .builder(jdbcTemplate, embeddingModel)
    //             .build();
    //
    //
    //     FilterExpressionBuilder filterExpressionBuilder = new FilterExpressionBuilder();
    //     Filter.Expression userId = filterExpressionBuilder.eq("userId", "88888888").build();
    //
    //     SearchRequest build = SearchRequest
    //             .builder()
    //             .query(message)
    //             .filterExpression(userId)
    //             .topK(5)
    //             .build();
    //
    //     System.out.println();
    //     System.out.println("              query: " + build.getQuery());
    //     System.out.println("               topK: " + build.getTopK());
    //     System.out.println("   filterExpression: " + build.getFilterExpression());
    //     System.out.println("similarityThreshold: " + build.getSimilarityThreshold());
    //     vectorStore.similaritySearch("123");
    //     List<Document> documentList = vectorStore.similaritySearch(build);
    //
    //
    //     System.out.println();
    //     if (documentList != null) {
    //         documentList.forEach(document -> {
    //             System.out.println(document.getId());
    //             System.out.println(document.getMetadata());
    //             System.out.println(document.getText());
    //             System.out.println(document.getMedia());
    //         });
    //     }
    //     return documentList;
    // }
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    // // ? ---------------------------------------------------------------------------------------------------------------
    // // ? ---------------------------------------------------------------------------------------------------------------
    // // ? ---------------------------------------------------------------------------------------------------------------
    // /**
    //  * 嵌入文件 ---> 存数据库
    //  * @param file 待嵌入的文件
    //  * @return 是否成功
    //  */
    // @SneakyThrows
    // @PostMapping("embedding")
    // public Boolean embedding(@RequestParam MultipartFile file) {
    //
    //     // 从IO流中读取文件
    //     TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new InputStreamResource(file.getInputStream()));
    //     // 将文本内容划分成更小的块
    //     List<Document> splitDocuments = new TokenTextSplitter().apply(tikaDocumentReader.read());
    //     // 存入向量数据库，这个过程会自动调用embeddingModel,将文本变成向量再存入。
    //
    //     OllamaOptions ollamaOptions = OllamaOptions.builder().model("bge-m3:latest").build();
    //     OllamaApi ollamaApi = new OllamaApi("http://127.0.0.1:11434");
    //     OllamaEmbeddingModel embeddingModel = OllamaEmbeddingModel.builder().ollamaApi(ollamaApi).defaultOptions(ollamaOptions).build();
    //     PgVectorStore pgVectorStore = PgVectorStore.builder(jdbcTemplate, embeddingModel).build();
    //
    //     pgVectorStore.add(splitDocuments);
    //     return true;
    // }
    //
    // @GetMapping("/documentSearch")
    // public List<Document> documentSearch(@RequestParam String message) {
    //     OllamaOptions ollamaOptions = OllamaOptions.builder().model("nomic-embed-text:latest").build();
    //     OllamaApi ollamaApi = new OllamaApi("http://127.0.0.1:11434");
    //     OllamaEmbeddingModel embeddingModel = OllamaEmbeddingModel.builder().ollamaApi(ollamaApi).defaultOptions(ollamaOptions).build();
    //     VectorStoreObservationConvention vectorStoreObservationConvention = new VectorStoreObservationConvention() {};
    //     Observation.Context asd = new Observation.Context();
    //     asd.setName("123123123-123121233");
    //     vectorStoreObservationConvention.supportsContext(asd);
    //
    //     PgVectorStore vectorStore = PgVectorStore
    //             .builder(jdbcTemplate, embeddingModel)
    //             .customObservationConvention(vectorStoreObservationConvention)
    //             .build();
    //
    //     return vectorStore.similaritySearch(message);
    // }
    // // ? ---------------------------------------------------------------------------------------------------------------
    // // ? ---------------------------------------------------------------------------------------------------------------
    // // ? ---------------------------------------------------------------------------------------------------------------
    //
    //
    //
    //
    //
    // // ? ---------------------------------------------------------------------------------------------------------------
    // // ? ---------------------------------------------------------------------------------------------------------------
    // // ? ---------------------------------------------------------------------------------------------------------------
    // /**
    //  * 嵌入文件 ---> 存文件
    //  * @param file 待嵌入的文件
    //  * @return 是否成功
    //  */
    // @SneakyThrows
    // @PostMapping("embeddingFile")
    // public Boolean embeddingFile(@RequestParam MultipartFile file) {
    //     String name = file.getOriginalFilename();
    //     System.out.println(name);
    //     // 从IO流中读取文件
    //     TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new InputStreamResource(file.getInputStream()));
    //     // 将文本内容划分成更小的块
    //     List<Document> splitDocuments = new TokenTextSplitter().apply(tikaDocumentReader.read());
    //     // 存入向量数据库，这个过程会自动调用embeddingModel,将文本变成向量再存入。
    //
    //
    //     OllamaOptions ollamaOptions = OllamaOptions.builder().model("bge-m3:latest").build();
    //     OllamaApi ollamaApi = new OllamaApi("http://127.0.0.1:11434");
    //     OllamaEmbeddingModel embeddingModel = OllamaEmbeddingModel.builder().ollamaApi(ollamaApi).defaultOptions(ollamaOptions).build();
    //
    //     SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(embeddingModel).build();
    //
    //     simpleVectorStore.add(splitDocuments);
    //     simpleVectorStore.save(new File("C:\\Users\\wang\\Desktop\\学习资料\\" + "test" + ".json"));
    //
    //     return true;
    // }
    //
    // @GetMapping("/documentSearchFile")
    // public List<Document> documentSearchFile(@RequestParam String message) {
    //     OllamaOptions ollamaOptions = OllamaOptions.builder().model("bge-m3:latest").build();
    //     OllamaApi ollamaApi = new OllamaApi("http://127.0.0.1:11434");
    //     OllamaEmbeddingModel embeddingModel = OllamaEmbeddingModel.builder().ollamaApi(ollamaApi).defaultOptions(ollamaOptions).build();
    //
    //     SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(embeddingModel).build();
    //
    //     simpleVectorStore.load(new File("C:\\Users\\wang\\Desktop\\学习资料\\" + "test.json"));
    //     List<Document> documents = simpleVectorStore.similaritySearch(message);
    //     System.out.println(documents);
    //     return documents;
    // }
    // // ? ---------------------------------------------------------------------------------------------------------------
    // // ? ---------------------------------------------------------------------------------------------------------------
    // // ? ---------------------------------------------------------------------------------------------------------------
    //
}
